'''
Description: 
Author: Zilu
Date: 2021-11-12 13:11:58
Version: 
LastEditTime: 2021-11-12 13:35:49
LastEditors: Zilu
'''

# struct 的 pack 可以把任意类型的数据转换成bytes
import struct
struct.pack('>I', 10240099)
# > 表示网络序，即bigendian，I表示四字节的无符号整型数

# unpack表示被bytes变成对应的数据类型
struct.unpack('>IH',b'\xf0\xf0\xf0\xf0\x80\x80')
# H 表示2字节的无符号整数

# struct模块定义的数据类型可以参考Python官方文档：
# https://docs.python.org/3/library/struct.html#format-characters

# Windows的位图文件（.bmp）是一种非常简单的文件格式，我们来用struct分析一下。
# BMP格式采用小端方式存储数据，文件头的结构按顺序如下：
# 两个字节：'BM'表示Windows位图，'BA'表示OS/2位图；
# 一个4字节整数：表示位图大小； 一个4字节整数：保留位，始终为0； 
# 一个4字节整数：实际图像的偏移量； 一个4字节整数：Header的字节数； 
# 一个4字节整数：图像宽度； 一个4字节整数：图像高度； 
# 一个2字节整数：始终为1； 一个2字节整数：颜色数。
s = b'\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00'

struct.unpack('<ccIIIIIIHH', s)

# 练习：请编写一个函数，可以检查任意文件是否是位图文件，如果是，打印出图片大小和颜色数
def bmpInfo(data):
    info = struct.unpack('<ccIIIIIIHH', data[:30])
    if info[0]+info[1] == b'BM':
        return {
            'width': info[6],
            'height': info[7],
            'color': info[9]
        }
    else:
        print('Not a BMP')

import base64
bmp_data = base64.b64decode('Qk1oAgAAAAAAADYAAAAoAAAAHAAAAAoAAAABABAAAAAAADICAAASCwAAEgsAA' +
                   'AAAAAAAAAAA/3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3/' +
                   '/f/9//3//f/9//3//f/9/AHwAfAB8AHwAfAB8AHwAfP9//3//fwB8AHwAfAB8/3//f/9/A' +
                   'HwAfAB8AHz/f/9//3//f/9//38AfAB8AHwAfAB8AHwAfAB8AHz/f/9//38AfAB8/3//f/9' +
                   '//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9//3//fwB8AHz/f' +
                   '/9//3//f/9/AHwAfP9//3//f/9//3//f/9//38AfAB8AHwAfAB8AHwAfP9//3//f/9/AHw' +
                   'AfP9//3//f/9//38AfAB8/3//f/9//3//f/9//3//fwB8AHwAfAB8AHwAfAB8/3//f/9//' +
                   '38AfAB8/3//f/9//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9' +
                   '//3//fwB8AHz/f/9/AHz/f/9/AHwAfP9//38AfP9//3//f/9/AHwAfAB8AHwAfAB8AHwAf' +
                   'AB8/3//f/9/AHwAfP9//38AfAB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8AHwAfAB8AHw' +
                   'AfAB8/3//f/9/AHwAfAB8AHz/fwB8AHwAfAB8AHwAfAB8AHz/f/9//3//f/9//3//f/9//' +
                   '3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//38AAA==')



